package API_Db;

import domain.Observer.Seance;
import domain.Utilisateur;
import java.sql.ResultSet;

/**
 * @author Damador
 */
public class API_Db_Utilisateur implements IAPI_Db_Utilisateur
{

    @Override
    public int inscrireDB(Utilisateur user) throws Exception
    {
        ConnexionDB connect = ConnexionDB.getConnexion();

        String requeteInsertion = "INSERT INTO utilisateur "
                + "(id_utilisateur, nom, prenom, sexe, date_naissance, rue, ville, code_postal,"
                + "telephone, login, mot_de_passe, email, date_derniere_connexion, actif) VALUES"
                + "( NULL, '" + user.getNom() + "','" + user.getPrenom() + "','" + user.getSexe() + "',"
                + "'" + user.getDateNaissance() + "','" + user.getRue() + "','" + user.getVille() + "',"
                + "'" + user.getCodePostal() + "','" + user.getTelephone() + "','" + user.getLogin() + "',"
                + "MD5('" + user.getMotDePasse() + "'),'" + user.getEmail() + "',NULL," + user.getActif()
                + ");";

        connect.executerRequeteUpdate(requeteInsertion);
        ResultSet res;
        String requeteGetProduit = "SELECT MAX(id_utilisateur) id_utilisateur FROM utilisateur;";
        res = connect.executerRequeteQuery(requeteGetProduit);

        if (res.next())
        {
            return res.getInt("id_utilisateur");
        }
        return 0;
    }

    @Override
    public Utilisateur identifierDB(String login, String mdp) throws Exception
    {
        ResultSet res;
        ConnexionDB connect = ConnexionDB.getConnexion();
        String requeteSelectUtilisateur = "Select * FROM utilisateur WHERE login = \""
                + login + "\" AND mot_de_passe = MD5('" + mdp + "');";

        res = connect.executerRequeteQuery(requeteSelectUtilisateur);
        Utilisateur user = null;
        if (res.next())
        {
            user = getUtilisateurParId(res.getInt("id_utilisateur"));
        }
        return user;
    }

    @Override
    public int modifierProfilDB(Utilisateur user) throws Exception
    {

        ConnexionDB connect = ConnexionDB.getConnexion();

        String requeteUpdateProfil = "UPDATE utilisateur set nom='" + user.getNom() + "',prenom='" + user.getPrenom() + "',sexe='" + user.getSexe() + "',"
                + "rue='" + user.getRue() + "',ville='" + user.getVille() + "',"
                + "code_postal='" + user.getCodePostal() + "',date_naissance = '" + user.getDateNaissance() + "',telephone='" + user.getTelephone() + "',login='" + user.getLogin() + "',"
                + "mot_de_passe=MD5('" + user.getMotDePasse() + "'),email='" + user.getEmail() + "'"
                + " WHERE id_utilisateur = " + user.getIdUtilisateur();

        return connect.executerRequeteUpdate(requeteUpdateProfil);
    }

    @Override
    public Utilisateur getUtilisateurParId(int id_utilisateur) throws Exception
    {
        ResultSet res;
        ConnexionDB connect = ConnexionDB.getConnexion();
        String requeteGetUtilisateur = "Select * FROM utilisateur WHERE id_utilisateur = " + id_utilisateur;
        res = connect.executerRequeteQuery(requeteGetUtilisateur);
        Utilisateur user = null;
        if (res.next())
        {
            user = new Utilisateur();
            user.setIdUtilisateur(res.getInt("id_utilisateur"));
            user.setNom(res.getString("nom"));
            user.setPrenom(res.getString("prenom"));
            user.setDateNaissance(res.getTimestamp("date_naissance"));
            user.setSexe(res.getString("sexe").charAt(0));
            user.setRue(res.getString("rue"));
            user.setVille(res.getString("ville"));
            user.setCodePostal(res.getString("code_postal"));
            user.setTelephone(res.getString("telephone"));
            user.setLogin(res.getString("login"));
            user.setMotDePasse(res.getString("mot_de_passe"));
            user.setEmail(res.getString("email"));
            //TODO verifier le retour de la date
            user.setDateDerniereConnexion(res.getTimestamp("date_derniere_connexion"));
            user.setActif(res.getInt("actif"));
        }
        return user;
    }

    @Override
    public int majDateDerniereConnexionDB(Utilisateur user) throws Exception
    {

        ConnexionDB connect = ConnexionDB.getConnexion();

        String requete = "UPDATE utilisateur set date_derniere_connexion = '" + user.getDateDerniereConnexion()
                + "' WHERE id_utilisateur = " + user.getIdUtilisateur();

        return connect.executerRequeteUpdate(requete);
    }

    @Override
    public Utilisateur recupererMotDePass(String mail) throws Exception
    {
        ResultSet res;
        ConnexionDB connect = ConnexionDB.getConnexion();
        String requeteGetUtilisateur = "Select * FROM utilisateur WHERE email = \"" + mail + "\";";
        res = connect.executerRequeteQuery(requeteGetUtilisateur);
        Utilisateur user = null;
        while (res.next())
        {
            user = new Utilisateur();
            user.setIdUtilisateur(res.getInt("id_utilisateur"));
            user.setNom(res.getString("nom"));
            user.setPrenom(res.getString("prenom"));
            user.setDateNaissance(res.getTimestamp("date_naissance"));
            user.setSexe(res.getString("sexe").charAt(0));
            user.setRue(res.getString("rue"));
            user.setVille(res.getString("ville"));
            user.setCodePostal(res.getString("code_postal"));
            user.setTelephone(res.getString("telephone"));
            user.setLogin(res.getString("login"));
            user.setMotDePasse(res.getString("mot_de_passe"));
            user.setEmail(res.getString("email"));
            user.setDateDerniereConnexion(res.getTimestamp("date_derniere_connexion"));
            user.setActif(res.getInt("actif"));
        }
        return user;
    }

    @Override
    public int changeEtatUtilisateurDB(int id_utilisateur, int etat) throws Exception
    {

        ConnexionDB connect = ConnexionDB.getConnexion();

        String requeteUpdateProfil = "UPDATE utilisateur set actif='" + etat + "' "
                + "WHERE id_utilisateur = '" + id_utilisateur + "'";

        return connect.executerRequeteUpdate(requeteUpdateProfil);
    }

    @Override
    public int creerCompteDB(int idUtilisateur) throws Exception
    {
        ConnexionDB connect = ConnexionDB.getConnexion();

        String requeteInsertion = "INSERT INTO compte VALUES (NULL,'" + idUtilisateur + "',0);";

        return connect.executerRequeteUpdate(requeteInsertion);
    }

    @Override
    public boolean loginExiste(String login, int id_utilisateur) throws Exception
    {
        ConnexionDB connect = ConnexionDB.getConnexion();
        ResultSet result;

        String requeteTestLogin = "Select id_utilisateur FROM utilisateur WHERE login='" + login + "'";
        result = connect.executerRequeteQuery(requeteTestLogin);

        if (!result.next())
        {
            return false;
        }
        else if (id_utilisateur != -1 && result.getInt("id_utilisateur") == id_utilisateur)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    @Override
    public boolean emailExiste(String email, int id_utilisateur) throws Exception
    {
        ConnexionDB connect = ConnexionDB.getConnexion();
        ResultSet result;

        String requeteTestMail = "Select id_utilisateur FROM utilisateur WHERE email='" + email + "'";
        result = connect.executerRequeteQuery(requeteTestMail);

        if (!result.next())
        {
            return false;
        }
        else if (id_utilisateur != -1 && result.getInt("id_utilisateur") == id_utilisateur)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    @Override
    public boolean idUtilisateurExisteCompte(int id_utilisateur) throws Exception
    {
        ConnexionDB connect = ConnexionDB.getConnexion();
        ResultSet result;

        String requeteTestIdUtilisateur = "Select id_utilisateur FROM compte WHERE id_utilisateur='" + id_utilisateur + "';";
        result = connect.executerRequeteQuery(requeteTestIdUtilisateur);
        if (result.next())
        {
            return true;
        }
        return false;
    }

    @Override
    public boolean estMeilleurEncherisseur(int id_utilisateur) throws Exception
    {
        ConnexionDB connect = ConnexionDB.getConnexion();
        ResultSet result;

        String requete = "Select id_seance FROM encherir WHERE id_utilisateur= " + id_utilisateur + ";";
        result = connect.executerRequeteQuery(requete);
        API_Db_Seance api_db_s = new API_Db_Seance();
        while (result.next())
        {
            Utilisateur user = api_db_s.getMeilleurEncherisseurDB(result.getInt("id_seance"));
            if (user.getIdUtilisateur() == id_utilisateur)
            {
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean estVendeurEnCours(int id_utilisateur) throws Exception
    {
        ConnexionDB connect = ConnexionDB.getConnexion();
        ResultSet result;

        String requete = "Select id_seance FROM seance WHERE etat="+Seance.EN_COURS + " OR etat= " + Seance.PRE_OUVERTURE +" AND id_vendeur= " + id_utilisateur + ";";
        System.out.println(requete);
        result = connect.executerRequeteQuery(requete);
        while (result.next())
        {
            return true;
        }
        return false;
    }
}
